package ar.edu.utn.frgp.labtec.entities;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;



@Entity()
@Table(name = "CONTRATO")
public class RevisionContrato implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id 
	@Column(name = "ID_CONTRATO")
	private Integer idContrato;
	
	@Id 
	@Column(name = "ANIO_CONTRATO")
	private String anioContrato;

	@ManyToOne
	@JoinColumn(name = "ID_CLIENTE")
	private Cliente cliente;
	
	@ManyToOne()
	 @JoinColumns(value = {
		@JoinColumn(name = "COD_LAB", referencedColumnName = "COD_LAB"),
		@JoinColumn(name = "COD_DEPTO", referencedColumnName = "COD_DEPTO")
	 })
	 @NotFound(action = NotFoundAction.IGNORE)
	private Laboratorio laboratorio; 
	
	@ManyToOne()
	@JoinColumn(name = "COD_DEPTO", insertable=false, updatable=false)
	@NotFound(action = NotFoundAction.IGNORE)
	private Departamento departamento;
	
	@Column(name = "ID_ORDEN")
	private Integer idOrden;
	
	@OneToOne()
	@JoinColumn(name = "ID_ORDEN", referencedColumnName = "ID_ORDEN", insertable=false, updatable=false)
    @NotFound(action = NotFoundAction.IGNORE)
    private OrdenDeTrabajo ordenDeTrabajo;

	@Column(name = "REQUISITOS")
	private String requisitos;

	@ManyToOne
	@JoinColumn(name = "USU_REQUISITOS")
	private Usuario usuRequisitos;

	@Column(name = "FECHA_REQUISITOS")
	private Date fechaRequisitos;

	// NO=0, SI=1;
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "RECURSOS_DISP")
	private BooleanEnum recursosDisp;

	@Column(name = "DETALLE_REC_DISP")
	private String detalleRecDisp;
	
	@ManyToOne
	@JoinColumn(name = "USU_DISPONIBILIDAD")
	private Usuario usuDisponibilidad;

	@Column(name = "FECHA_DISPONIBILIDAD")
	private Date fechaDisponibilidad;

	// NO=0, SI=1;
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "SUBCONTRATAR")
	private BooleanEnum subcontratar;

	@Column(name = "DETALLE_SUBC")
	private String detalleSubc;
	

	@Column(name = "TRABAJO_A_REALIZAR")
	private String trabajoArealizar;
	
	@Column(name = "FECHA_REALIZACION")
	private Date fechaRealizacion;
	
	// NO=0, SI=1;
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "ACUERDO_TRABAJO")
	private BooleanEnum acuerdoTrabajo;

	@Column(name = "FECHA_ACUERDO_TR")
	private Date fechaAcuerdoTrabajo;

	@ManyToOne
	@JoinColumn(name = "USU_ACUERDO_TR")
	private Usuario usuAcuerdoTrabajo;
	
	@Column(name = "CAUSAS_RECH_MODIF")
	private String causasRechModif;

	@Column(name = "FECHA_ENTREGA")
	private Date fechaEntrega;

	@Column(name = "DATOS_ELEM_MEDIR")
	private String datosElemMedir;

	// NO=0, SI=1;
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "ESTADO_CONSERV")
	private BooleanEnum estadoConserv;

	// NO=0, SI=1;
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "RECIBIO_ELEM")
	private BooleanEnum recibioElem;

	@Column(name = "FECHA_RECIBIO_ELEM")
	private Date fechaRecibioElem;

	@Column(name = "FECHA_ENTREGA_INF")
	private Date fechaEntregaInf;

	@ManyToOne
	@JoinColumn(name = "USU_ENTREGA")
	private Usuario usuEntrega;
	
	// H= habilitado, I=inhabilitado
	@Enumerated(EnumType.STRING)
	@Column(name = "ESTADO")
	private EstadoEnum estado;

	// ############ EQUALS ############
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		RevisionContrato other = (RevisionContrato) obj;
		if (idContrato == null) {
			if (other.idContrato != null)
				return false;
		} else if (!idContrato.equals(other.idContrato))
			return false;
		return true;
	}

	// ############ CONSTRUCTOR ############
	public RevisionContrato() {
	}

	// ############ GETTERS Y SETTERS ############
	public Integer getIdContrato() {
		return idContrato;
	}

	public void setIdContrato(Integer idContrato) {
		this.idContrato = idContrato;
	}

	public String getAnioContrato() {
		return anioContrato;
	}

	public void setAnioContrato(String anioContrato) {
		this.anioContrato = anioContrato;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public OrdenDeTrabajo getOrdenDeTrabajo() {
		return ordenDeTrabajo;
	}

	public void setOrdenDeTrabajo(OrdenDeTrabajo ordenDeTrabajo) {
		this.ordenDeTrabajo = ordenDeTrabajo;
	}

	public String getRequisitos() {
		return requisitos;
	}

	public void setRequisitos(String requisitos) {
		this.requisitos = requisitos;
	}

	public Date getFechaRequisitos() {
		return fechaRequisitos;
	}

	public void setFechaRequisitos(Date fechaRequisitos) {
		this.fechaRequisitos = fechaRequisitos;
	}

	public BooleanEnum getRecursosDisp() {
		return recursosDisp;
	}

	public void setRecursosDisp(BooleanEnum recursosDisp) {
		this.recursosDisp = recursosDisp;
	}

	public String getDetalleRecDisp() {
		return detalleRecDisp;
	}

	public void setDetalleRecDisp(String detalleRecDisp) {
		this.detalleRecDisp = detalleRecDisp;
	}

	public BooleanEnum getSubcontratar() {
		return subcontratar;
	}

	public void setSubcontratar(BooleanEnum subcontratar) {
		this.subcontratar = subcontratar;
	}

	public String getDetalleSubc() {
		return detalleSubc;
	}

	public void setDetalleSubc(String detalleSubc) {
		this.detalleSubc = detalleSubc;
	}

	public String getTrabajoArealizar() {
		return trabajoArealizar;
	}

	public void setTrabajoArealizar(String trabajoArealizar) {
		this.trabajoArealizar = trabajoArealizar;
	}

	public BooleanEnum getAcuerdoTrabajo() {
		return acuerdoTrabajo;
	}

	public void setAcuerdoTrabajo(BooleanEnum acuerdoTrabajo) {
		this.acuerdoTrabajo = acuerdoTrabajo;
	}

	public Date getFechaAcuerdoTrabajo() {
		return fechaAcuerdoTrabajo;
	}

	public void setFechaAcuerdoTrabajo(Date fechaAcuerdoTrabajo) {
		this.fechaAcuerdoTrabajo = fechaAcuerdoTrabajo;
	}

	public String getCausasRechModif() {
		return causasRechModif;
	}

	public void setCausasRechModif(String causasRechModif) {
		this.causasRechModif = causasRechModif;
	}

	public Date getFechaEntrega() {
		return fechaEntrega;
	}

	public void setFechaEntrega(Date fechaEntrega) {
		this.fechaEntrega = fechaEntrega;
	}

	public String getDatosElemMedir() {
		return datosElemMedir;
	}

	public void setDatosElemMedir(String datosElemMedir) {
		this.datosElemMedir = datosElemMedir;
	}

	public BooleanEnum getEstadoConserv() {
		return estadoConserv;
	}

	public void setEstadoConserv(BooleanEnum estadoConserv) {
		this.estadoConserv = estadoConserv;
	}

	public BooleanEnum getRecibioElem() {
		return recibioElem;
	}

	public void setRecibioElem(BooleanEnum recibioElem) {
		this.recibioElem = recibioElem;
	}

	public Date getFechaRecibioElem() {
		return fechaRecibioElem;
	}

	public void setFechaRecibioElem(Date fechaRecibioElem) {
		this.fechaRecibioElem = fechaRecibioElem;
	}

	public Date getFechaEntregaInf() {
		return fechaEntregaInf;
	}

	public void setFechaEntregaInf(Date fechaEntregaInf) {
		this.fechaEntregaInf = fechaEntregaInf;
	}

	public Usuario getUsuRequisitos() {
		return usuRequisitos;
	}

	public void setUsuRequisitos(Usuario usuRequisitos) {
		this.usuRequisitos = usuRequisitos;
	}

	public Usuario getUsuAcuerdoTrabajo() {
		return usuAcuerdoTrabajo;
	}

	public void setUsuAcuerdoTrabajo(Usuario usuAcuerdoTrabajo) {
		this.usuAcuerdoTrabajo = usuAcuerdoTrabajo;
	}

	public Usuario getUsuEntrega() {
		return usuEntrega;
	}

	public void setUsuEntrega(Usuario usuEntrega) {
		this.usuEntrega = usuEntrega;
	}

	public void setLaboratorio(Laboratorio laboratorio) {
		this.laboratorio = laboratorio;
	}

	public Laboratorio getLaboratorio() {
		return laboratorio;
	}

	public void setUsuDisponibilidad(Usuario usuDisponibilidad) {
		this.usuDisponibilidad = usuDisponibilidad;
	}

	public Usuario getUsuDisponibilidad() {
		return usuDisponibilidad;
	}

	public void setFechaDisponibilidad(Date fechaDisponibilidad) {
		this.fechaDisponibilidad = fechaDisponibilidad;
	}

	public Date getFechaDisponibilidad() {
		return fechaDisponibilidad;
	}

	public void setFechaRealizacion(Date fechaRealizacion) {
		this.fechaRealizacion = fechaRealizacion;
	}

	public Date getFechaRealizacion() {
		return fechaRealizacion;
	}

	public void setEstado(EstadoEnum estado) {
		this.estado = estado;
	}

	public EstadoEnum getEstado() {
		return estado;
	}

	public Departamento getDepartamento() {
		return departamento;
	}

	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}

	public void setIdOrden(Integer idOrden) {
		this.idOrden = idOrden;
	}

	public Integer getIdOrden() {
		return idOrden;
	}



}
